package com.geek.javase.ch18.videodemo.reflect.methods;

import org.junit.Test;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.stream.Stream;

/*
 *@Date 2025/11/5
 *@Author wangpeng
 *@Description
 *  *  * 如何获取Method对象？
 *  * 1.public Method[] getMethods() 指定类类型，返回所有公开的方法
 *  * 2.public Method getMethod(String name, Class<?>... parameterTypes) 指定类类型，根据传入 方法名 和 及其形参列表类类型，返回所有匹配的公开方法
 *  * 3.public Method[] getDeclaredMethods() 指定类类型，返回所有的方法（包括私有的）
 *  * 4.public Method getDeclaredMethod(String name, Class<?>... parameterTypes) 指定类类型，根据传入 方法名 和 及其形参列表类类型，返回所有匹配的方法（包括私有的）
 */
public class MethodsDemo1 {
    //1.public Method[] getMethods() 指定类类型，返回所有公开的方法
    @Test
    public void testGetMethods() {
        //获取类类型(这里是User类型)
        Class<User> clazz = User.class;
        //获取所有的公开方法（获取本类及其父类的所有公开方法）
        Method[] methods = clazz.getMethods();
        Stream.of(methods).forEach(method -> {
            System.out.println("方法名："+method.getName()+"--,方法形参个数："+method.getParameterCount());
        });
    }
    // 2.public Method getMethod(String name, Class<?>... parameterTypes) 指定类类型，根据传入 方法名 和 及其形参列表类类型，返回所有匹配的公开方法
    @Test
    public void testGetMethod() throws NoSuchMethodException {
        Class<User> clazz = User.class;

        Method eatMethod = clazz.getMethod("eat");
        System.out.println(eatMethod.getName()+","+eatMethod.getParameterCount()+ Arrays.toString(eatMethod.getParameterTypes()));

        Method playMethod = clazz.getMethod("play", int.class);
        System.out.println(playMethod.getName()+","+playMethod.getParameterCount()+ Arrays.toString(playMethod.getParameterTypes()));

        //私有的方法
        Method sleepMethod = clazz.getMethod("sleep");
        System.out.println(sleepMethod.getName()+","+sleepMethod.getParameterCount()+ Arrays.toString(sleepMethod.getParameterTypes()));
    }
    // 3.public Method[] getDeclaredMethods() 指定类类型，返回所有的方法（包括私有的）
    @Test
    public void testGetDeclaredMethods() {
        //获取类类型
        Class<User> clazz = User.class;
        //获取本类中的所有的方法（私有方法）
        Method[] methods = clazz.getDeclaredMethods();

        Stream.of(methods).forEach(method -> {
            System.out.println("方法名："+method.getName()+"--,方法形参个数："+method.getParameterCount());
        });
    }
    // 4.public Method getDeclaredMethod(String name, Class<?>... parameterTypes) 指定类类型，根据传入 方法名 和 及其形参列表类类型，返回所有匹配的方法（包括私有的）
    @Test
    public void testGetDeclaredMethod() throws NoSuchMethodException {
        Class<User> clazz = User.class;
        //获取指定的方法
        Method playMethod = clazz.getDeclaredMethod("play", int.class);
        System.out.println(playMethod.getName()+","+playMethod.getParameterCount()+ Arrays.toString(playMethod.getParameterTypes()));

        //私有的方法
        Method sleepMethod = clazz.getDeclaredMethod("sleep");
        System.out.println(sleepMethod.getName()+","+sleepMethod.getParameterCount()+ Arrays.toString(sleepMethod.getParameterTypes()));
    }

}
